package org.tri.backgroundtasks;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.tri.entity.Venta;
import org.tri.persistence.PersistenceManager;
import org.tri.persistence.search.BusquedaVenta;

/**
 * La clase {@code OldVentasDeleterTask} es una tarea recurrente que se encarga
 * de eliminar ventas que son consideradas "viejas" por tener mas de cierto 
 * tiempo de antigüedad.
 * @author kiira
 * @version 1.0, Apr 1, 2012
 */
public class OldVentasDeleterTask implements Runnable {
    /** Unidad del intervalo de repetición de la task. */
    private static TimeUnit REPEAT_TIME_UNIT = TimeUnit.DAYS;
    /** Intervalo de repetición de la task. */
    private static int REPEAT_INTERVAL = 1;
    /** Unidad de calendario con el cual calcular la fecha. */
    private static int OLD_VENTAS_CALENDAR_UNIT = Calendar.YEAR;
    /** Intervalo para calcular la fecha de ventas "viejas". */
    private static int OLD_VENTAS_OLDNESS = -1;
    
    /**
     * Constructor privado ya que no se deben crear instancias de este objeto.
     */
    private OldVentasDeleterTask() {
               
    }//end constructor
        
    /**
     * Busca las ventas que esten fuera del rango especificado (y por lo tanto
     * consideradas "viejas") y las elimina de la tabla de ventas actuales.
     */
    @Override
    public void run() {
        //calculamos la fecha correspondiente
        Calendar cal = Calendar.getInstance();
        cal.add( OLD_VENTAS_CALENDAR_UNIT, OLD_VENTAS_OLDNESS);
        
        Date fechaLimite = cal.getTime();
        
        //buscamos las ventas correspondientes
        BusquedaVenta busqueda = new BusquedaVenta();
        busqueda.porFechaAnteriorA( fechaLimite );
        
        List<Venta> ventas = busqueda.listarResultados();
        
        //eliminamos las ventas
        for ( Venta venta : ventas )
            PersistenceManager.makeTransient( venta );
        
    }//end método run

    /**
     * Planifica la ejecución de esta task en un executor.
     * @param executor executor en el cual schedulear esta task.
     */
    public static void scheduleTask( ScheduledExecutorService executor ) {
        executor.scheduleAtFixedRate( new OldVentasDeleterTask(),
                                      0,
                                      REPEAT_INTERVAL,
                                      REPEAT_TIME_UNIT );
        
    }//end método scheduleTask
    
}//end clase OldVentasDeleterTask
